summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorliamwhite <liamwhite@users.noreply.github.com>2024-02-21 16:43:46 +0100
committerGitHub <noreply@github.com>2024-02-21 16:43:46 +0100
commit8bbc209950178ca7258bfc22a08101cb30c29a58 (patch)
tree642d3775fa0136b84bbfcff7363441bd8f4145df
parentfs: add missing mutex header for member (#13106) (diff)
parentandroid: Connect controllers with supported styles (diff)
downloadyuzu-8bbc209950178ca7258bfc22a08101cb30c29a58.tar
yuzu-8bbc209950178ca7258bfc22a08101cb30c29a58.tar.gz
yuzu-8bbc209950178ca7258bfc22a08101cb30c29a58.tar.bz2
yuzu-8bbc209950178ca7258bfc22a08101cb30c29a58.tar.lz
yuzu-8bbc209950178ca7258bfc22a08101cb30c29a58.tar.xz
yuzu-8bbc209950178ca7258bfc22a08101cb30c29a58.tar.zst
yuzu-8bbc209950178ca7258bfc22a08101cb30c29a58.zip
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt6
-rw-r--r--src/android/app/src/main/jni/native.cpp3
-rw-r--r--src/android/app/src/main/jni/native_input.cpp76
3 files changed, 52 insertions, 33 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt
index d35de80c4..a84ac77a2 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt
@@ -64,17 +64,17 @@ data class PlayerInput(
fun hasMapping(): Boolean {
var hasMapping = false
buttons.forEach {
- if (it != "[empty]") {
+ if (it != "[empty]" && it.isNotEmpty()) {
hasMapping = true
}
}
analogs.forEach {
- if (it != "[empty]") {
+ if (it != "[empty]" && it.isNotEmpty()) {
hasMapping = true
}
}
motions.forEach {
- if (it != "[empty]") {
+ if (it != "[empty]" && it.isNotEmpty()) {
hasMapping = true
}
}
diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp
index 4ea82e217..1226219ad 100644
--- a/src/android/app/src/main/jni/native.cpp
+++ b/src/android/app/src/main/jni/native.cpp
@@ -292,6 +292,9 @@ void EmulationSession::ShutdownEmulation() {
// Unload user input.
m_system.HIDCore().UnloadInputDevices();
+ // Enable all controllers
+ m_system.HIDCore().SetSupportedStyleTag({Core::HID::NpadStyleSet::All});
+
// Shutdown the main emulated process
if (m_load_result == Core::SystemResultStatus::Success) {
m_system.DetachDebugger();
diff --git a/src/android/app/src/main/jni/native_input.cpp b/src/android/app/src/main/jni/native_input.cpp
index 37a65f2b8..4935a4607 100644
--- a/src/android/app/src/main/jni/native_input.cpp
+++ b/src/android/app/src/main/jni/native_input.cpp
@@ -102,8 +102,50 @@ void ApplyControllerConfig(size_t player_index,
}
}
+std::vector<s32> GetSupportedStyles(int player_index) {
+ auto& hid_core = EmulationSession::GetInstance().System().HIDCore();
+ const auto npad_style_set = hid_core.GetSupportedStyleTag();
+ std::vector<s32> supported_indexes;
+ if (npad_style_set.fullkey == 1) {
+ supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::Fullkey));
+ }
+
+ if (npad_style_set.joycon_dual == 1) {
+ supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::JoyconDual));
+ }
+
+ if (npad_style_set.joycon_left == 1) {
+ supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::JoyconLeft));
+ }
+
+ if (npad_style_set.joycon_right == 1) {
+ supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::JoyconRight));
+ }
+
+ if (player_index == 0 && npad_style_set.handheld == 1) {
+ supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::Handheld));
+ }
+
+ if (npad_style_set.gamecube == 1) {
+ supported_indexes.push_back(static_cast<s32>(Core::HID::NpadStyleIndex::GameCube));
+ }
+
+ return supported_indexes;
+}
+
void ConnectController(size_t player_index, bool connected) {
auto& hid_core = EmulationSession::GetInstance().System().HIDCore();
+ ApplyControllerConfig(player_index, [&](Core::HID::EmulatedController* controller) {
+ auto supported_styles = GetSupportedStyles(player_index);
+ auto controller_style = controller->GetNpadStyleIndex(true);
+ auto style = std::find(supported_styles.begin(), supported_styles.end(),
+ static_cast<int>(controller_style));
+ if (style == supported_styles.end() && !supported_styles.empty()) {
+ controller->SetNpadStyleIndex(
+ static_cast<Core::HID::NpadStyleIndex>(supported_styles[0]));
+ }
+ });
+
if (player_index == 0) {
auto* handheld = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
auto* player_one = hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1);
@@ -522,36 +564,10 @@ jint Java_org_yuzu_yuzu_1emu_features_input_NativeInput_getButtonNameImpl(JNIEnv
jintArray Java_org_yuzu_yuzu_1emu_features_input_NativeInput_getSupportedStyleTagsImpl(
JNIEnv* env, jobject j_obj, jint j_player_index) {
- auto& hid_core = EmulationSession::GetInstance().System().HIDCore();
- const auto npad_style_set = hid_core.GetSupportedStyleTag();
- std::vector<s32> supported_indexes;
- if (npad_style_set.fullkey == 1) {
- supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::Fullkey));
- }
-
- if (npad_style_set.joycon_dual == 1) {
- supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::JoyconDual));
- }
-
- if (npad_style_set.joycon_left == 1) {
- supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::JoyconLeft));
- }
-
- if (npad_style_set.joycon_right == 1) {
- supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::JoyconRight));
- }
-
- if (j_player_index == 0 && npad_style_set.handheld == 1) {
- supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::Handheld));
- }
-
- if (npad_style_set.gamecube == 1) {
- supported_indexes.push_back(static_cast<u32>(Core::HID::NpadStyleIndex::GameCube));
- }
-
- jintArray j_supported_indexes = env->NewIntArray(supported_indexes.size());
- env->SetIntArrayRegion(j_supported_indexes, 0, supported_indexes.size(),
- supported_indexes.data());
+ auto supported_styles = GetSupportedStyles(j_player_index);
+ jintArray j_supported_indexes = env->NewIntArray(supported_styles.size());
+ env->SetIntArrayRegion(j_supported_indexes, 0, supported_styles.size(),
+ supported_styles.data());
return j_supported_indexes;
}